/*
 * 工厂模式是比较简单，也是比较好用的一种方式。根本上说，工厂模式的目的就根据不同的要求输出不同的产品。
 *
 * 比如说吧，有一个生产鞋子的工厂，它能生产皮鞋，也能生产胶鞋。如果用代码设计，应该怎么做呢？
 */

typedef struct shoe
{
	int type;
	void (*print_shoe)(struct shoe *);
}shoe;

/*
 * 就像上面说的，现在有胶鞋，那也有皮鞋，我们该怎么做呢？
 */
void print_leather_shoe(struct shoe * pshoe)
{
	assert(NULL != pshoe);
	printf("This is a leather show!\n");
}

void print_rubber_shoe(struct shoe * pshoe)
{
	assert(NULL != pshoe);
	printf("This is a rubber shoe!\n");
}

/*
 * 所以，对于一个工厂来说，创建什么样的鞋子，就看我们输入的参数是什么？至于结果，那都是一样的。 
 */


#define LEATHER_TYPE	0x01
#define RUBBER_TYPE		0x02

shoe * manufacture_new_shoe(int type)
{
	assert(LEATHER_TYPE == type || RUBBER_TYPE == type);

	shoe * pshoe = (shoe*)malloc(sizeof(shoe));
	assert(NULL != pshoe);

	memset(pshoe, 0, sizeof(shoe));
	if (LEATHER_TYPE == type) {
		pshoe->type == LEATHER_TYPE;
		pshoe->print_shoe = print_leather_shoe;
	}
	else {
		pshoe->type == RUBBER_TYPE;
		pshoe->print_shoe = print_rubber_shoe;
	}

	return pshoe;
}